package BD;

import java.util.Iterator;
import java.util.List;
import javax.swing.table.AbstractTableModel;


public class TableModel extends AbstractTableModel {

    private String[] headerCliente = {"Clave", "Fecha de pago",
        "Nombre del cliente", "Total"};
    private String[] headerProveedores = {"Clave", "Fecha de pago",
        "Nombre del proveedor", "RFC", "Total"};
    private String[] headerEmpleados = {"Clave", "Fecha de pago",
        "Nombre del empleado", "Tipo de pago", "Modelo",
        "Cantidad", "Precio", "Total"};
    //Este arreglo guarda los encabezados y lo registros
    public Object[][] tableModel;
    //Recibe el nombre de la tabla que se va a cargar
    public String pestañaActiva = null;
    //Estos son los encabezados que tendrá el modelo
    private String headers[] = null;

    public TableModel(String nameTable, List registrosConsulta) {
        this.pestañaActiva = nameTable;
        getColumnNames();
        this.fillTableModel(registrosConsulta);
    }

    @Override
    public int getRowCount() {
        return tableModel.length;
    }

    @Override
    public int getColumnCount() {
        return headers.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return tableModel[rowIndex][columnIndex];
    }

    @Override
    public String getColumnName(int column) {
        return headers[column];
    }

    public Class getColumnClass(int fila, int col) {
        return tableModel[fila][col].getClass();

    }

    @Override
    public boolean isCellEditable(int row, int column) {
        // Aquí devolvemos true o false según queramos que una celda
        // identificada por fila,columna (row,column), sea o no editable
        if (column == 0 || column == 1) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public void setValueAt(Object value, int Fila, int Col) {
        if (value == null) {
            return;
        }
        tableModel[Fila][Col] = value;
        this.fireTableCellUpdated(Fila, Col);
    }

    private String[] getColumnNames() {
        switch (pestañaActiva) {
            case "Clientes":
                headers = headerCliente;
                break;
            case "Empleados":
                headers = headerEmpleados;
                break;
            case "Proveedores":
                headers = headerProveedores;
                break;
        }
        return headers;
    }

    private void fillTableModel(List registrosConsulta) {
        Iterator it = registrosConsulta.iterator();
        int contFila = 0, contCol = 0, numColumnas = 0;
        try {
            numColumnas = getColumnCount();
        } catch (Exception e) {
            throw e;
        }
        tableModel = new Object[registrosConsulta.size()][numColumnas];
        //Elige la accion por el nombre de la pestaña activa
        switch (pestañaActiva) {
            //Carga los pagos de los clietes
            case "Clientes":
                try {
                    while (it.hasNext()) {
                        while (contCol < numColumnas && it.hasNext()) {
                            Pagoscliente pagosCliente = (Pagoscliente) it.next();
                            tableModel[contFila][contCol] = pagosCliente.getId();
                            contCol++;
                            tableModel[contFila][contCol] = pagosCliente.getFecha();
                            contCol++;
                            tableModel[contFila][contCol] = pagosCliente.getNombre();
                            contCol++;
                            tableModel[contFila][contCol] = pagosCliente.getTotal();
                            contCol++;
                        }
                        contCol = 0;
                        contFila++;
                    }
                } catch (Exception e) {
                    throw e;
                }
                break;
            case "Empleados":
                try {
                    while (it.hasNext()) {
                        while (contCol < numColumnas && it.hasNext()) {
                            Pagoempleados pagosEmpleados = (Pagoempleados) it.next();
                            tableModel[contFila][contCol] = pagosEmpleados.getId();
                            contCol++;
                            tableModel[contFila][contCol] = pagosEmpleados.getFecha();
                            contCol++;
                            tableModel[contFila][contCol] = pagosEmpleados.getNombre();
                            contCol++;
                            tableModel[contFila][contCol] = pagosEmpleados.getTipopago();
                            contCol++;
                            tableModel[contFila][contCol] = pagosEmpleados.getModelo();
                            contCol++;
                            tableModel[contFila][contCol] = pagosEmpleados.getCantidad();
                            contCol++;
                            tableModel[contFila][contCol] = pagosEmpleados.getPrecio();
                            contCol++;
                            tableModel[contFila][contCol] = pagosEmpleados.getTotal();
                            contCol++;
                        }
                        contCol = 0;
                        contFila++;
                    }
                } catch (Exception e) {
                    throw e;
                }
                break;
            case "Proveedores":
                try {
                    while (it.hasNext()) {
                        while (contCol < numColumnas && it.hasNext()) {
                            Pagosproveedores pagosProveedores = (Pagosproveedores) it.next();
                            tableModel[contFila][contCol] = pagosProveedores.getId();
                            contCol++;
                            tableModel[contFila][contCol] = pagosProveedores.getFecha();
                            contCol++;
                            tableModel[contFila][contCol] = pagosProveedores.getNombre();
                            contCol++;
                            tableModel[contFila][contCol] = pagosProveedores.getRfc();
                            contCol++;
                            tableModel[contFila][contCol] = pagosProveedores.getTotal();
                            contCol++;
                        }
                        contCol = 0;
                        contFila++;
                    }
                } catch (Exception e) {
                    throw e;
                }
                break;
        }

    }
}
